<?php

namespace app\api\controller;


use think\Controller;
use think\Loader;

//支付网关通知接口
class Paynotify extends Controller{

	
	//支付完成后，外部网关异步通知地址，微信支付通知
	function wxpay_notify(){
		$postXml = file_get_contents("php://input");
		$notify_info = json_decode(json_encode(simplexml_load_string($postXml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);//

		$this->check_orderinfo($notify_info);
	}

	//在此会进行订单状态的改变，这里严格验证，改变订单状态
    function check_orderinfo($notify_info=[]){

        $out_trade_no   = $notify_info['out_trade_no'];//获取订单号
        $order_model = Loader::model('OrderInfo');//订单model,考虑以是否多订单表（根据回调的标识或者订单号前缀区分）
        if (!$out_trade_no){
            $this->error('无效的通知请求');
            return;
        }
        /* 获取订单信息 */
        $where = " order_sn='{$out_trade_no}' AND (order_status=0 OR order_status= -1) ";
        $order_info = $order_model->find($where);//['order_sn'=>$out_trade_no]
        // var_dump($order_info);exit;
        if (empty($order_info)){
            $this->error('没有该订单');
            return;
        }

        /* 调用相应的支付方式 */
        $payment_info = config('wechat.wxapp');//支付配置
        \think\Loader::import('org.payments.wap.wxpay.Wxpay',EXTEND_PATH);//导入第三方支付类
        $payment =  new \Wxpay($payment_info);
        /* 获取验证结果 */
        $notify_result = $payment->verify_notify($order_info, true,'POST');
        // var_dump($notify_result);exit;
		//订单表order_sn数组
		$order_idarr = array(
			'order_sn'=>$out_trade_no,
		);
        if ($notify_result === false){//支付失败
			//改变订单状态
			if(!empty($notify_info)){
				$notify_info['trade_no'] = $notify_info['transaction_id'];
				$notify_info['order_status'] = -1;//支付状态
				$notify_result['pay_notify'] = $notify_info;
			}
			if ($order_info['order_status'] == 0 || $order_info['order_status'] == -1){
				$this->_change_order_status(false,$order_info,$order_model,$order_idarr,$notify_result);
			}
            //响应支付结果
            $payment->verify_result(false);
            return;
        }

		//改变订单状态
		if ($order_info['order_status'] == 0 || $order_info['order_status'] == -1){
			$this->_change_order_status(true,$order_info,$order_model,$order_idarr,$notify_result);
		}
        $payment->verify_result(true);	//返回验证结果给支付网关

    }

    /**
     *    改变订单状态
     *
	 *    @param     bool $flag  true|false //支付状态
     *    @param     array $order_info		//订单信息
     *    @param     obj  $order_model		//操作对象
	 *    @param     array  $order_idarr	//活动订单id （只有一个值，用来区分订单）
     *    @return    void
     */

	 function _change_order_status($flag=false,$order_info,$order_model,$order_idarr,$notify_result=''){

		if($flag===false){
			$notify_result['order_status']= -1;	//交易失败 ORDER_FAILED
		}
		//$order_id区分不同订单表
		if($order_idarr['order_sn']){
			
	        $pay_time = $order_info['pay_time'] = time();
	        $pay_data = array(
	                'out_trade_no'=>$notify_result['pay_notify']['trade_no'],//支付平台外部订单号
	                'order_status'=>$notify_result['order_status'],
	                'pay_status'=>$notify_result['order_status'],
	                'pay_time'=>$pay_time,
	        );

	        if($flag){//成功
	            $pay_data['pay_time']=$pay_time;
	            
	        }
	        $param['order_id'] = $order_info['order_id'];
	        $param['user_id'] =$order_info['user_id'];
	        $order_status = $order_model->update_data($param,$pay_data);
	        if(!empty($order_status)){
	            //支付日志 2018-04-10 14:28:19
	            $goods_info = db('goods')->where(['id'=>$order_info['goods_id']])->find();//查询出下单商品信息
	            $user_info = [
	            	'id'=>$order_info['user_id'],
	            	'user_name'=>$order_info['user_name']
	            ];
	            $desc = '购买商品'.$goods_info['goods_name'].'x'.$goods_info['goods_number'];
	            $res = Loader::model('UserGoodsModel')->change_user_goods_record($goods_info,$user_info,$desc);//更新用户物品包记录
	        }
	        return $order_status;

		}else{
			 $this->error('更新订单参数有误');
            return;
		}
	
	 }





	
}